package br.com.saeng2D.analiseLxSi.al;

public class AnalisadorLexico {
	public StringBuilder cadeiaReconhecida;
	public int indiceReconhecido;
	private String stringFonte;
	public Estado estado;
	private boolean log;
	public int indice;

	public AnalisadorLexico(String stringFonte, boolean log) {
		this.cadeiaReconhecida = new StringBuilder();
		this.stringFonte = stringFonte.trim();
		this.indiceReconhecido = 0;
		this.indice = 0;
		this.log = log;
	}

	public String getCadeiaReconhecida() {
		return cadeiaReconhecida.toString();
	}

	public void reconhecerAtomico() throws Exception {
		estado = new EInicial(this);
		cadeiaReconhecida = new StringBuilder();
		while (indice < stringFonte.length()) {
			char c = stringFonte.charAt(indice);
			boolean parar = estado.processar(c);
			if (parar) {
				break;
			}
			indice++;
		}
		if (estado.ehValido()) {
			if (log) {
				System.out.println("Estado do AL[" + estado.getClass().getSimpleName() + "] Cadeia reconhecida[" + cadeiaReconhecida.toString() + "] VALIDO.");
			}
		} else {
			throw new Exception("Estado do AL[" + estado.getClass().getSimpleName() + "] Cadeia reconhecida[" + cadeiaReconhecida.toString() + "] INVALIDO.");
		}
	}

	public boolean analisado() {
		return indice >= stringFonte.length();
	}
	
	public Estado getEstado() {
		return estado;
	}
}